#ifndef AREAEXAMPLE_SRC_CORE_TIMEMANAGER_H_
#define AREAEXAMPLE_SRC_CORE_TIMEMANAGER_H_

#include <iostream>
#include <chrono>
#include <functional>
#include <thread>
/**
 * @brief 控制帧率的类，用于限制应用程序的帧率。
 */
class FrameRateController {
public:
    /**
     * @brief 构造一个 FrameRateController 对象。
     *
     * @param targetFPS 目标帧率，表示每秒多少帧。
     * @throw std::invalid_argument 如果目标帧率小于等于0，则抛出无效参数异常。
     */
    FrameRateController(int targetFPS) {
        if (targetFPS <= 0) {
            throw std::invalid_argument("目标帧率必须大于0");
        }
        targetFrameTime = std::chrono::milliseconds(1000) / targetFPS;
    }

    /**
     * @brief 启动帧率控制循环，并执行每帧逻辑。
     *
     * @param frameLogic 一个带有单个浮点型参数的函数，表示每帧逻辑。
     *                   该函数将接收当前帧的时间间隔（Δt）作为参数。
     */
    void Start(std::function<void(float)> frameLogic) {
        while (true) {
            std::chrono::high_resolution_clock::time_point frameStartTime = std::chrono::high_resolution_clock::now();

            std::chrono::high_resolution_clock::time_point frameEndTime;

            // 在这里执行每帧的逻辑
            frameLogic(deltaTime);

            frameEndTime = std::chrono::high_resolution_clock::now();

            // 计算delta time（Δt）
            std::chrono::milliseconds frameElapsedTime = std::chrono::duration_cast<std::chrono::milliseconds>(frameEndTime - frameStartTime);
            deltaTime = static_cast<float>(frameElapsedTime.count()) / 1000.0f; // 转换为秒

            // 计算需要等待的时间，以达到目标帧率
            std::chrono::milliseconds sleepTime = targetFrameTime - frameElapsedTime;
            if (sleepTime > std::chrono::milliseconds(0)) {
                std::this_thread::sleep_for(sleepTime);
            } else {
                std::cout << "超出帧时间间隔" << std::endl;
            }
        }
    }

private:
    std::chrono::milliseconds targetFrameTime; ///< 目标帧时间间隔。
    float deltaTime{0}; ///< 当前帧的时间间隔（Δt），以秒为单位。
};


#endif // AREAEXAMPLE_SRC_CORE_TIMEMANAGER_H_